package com.itbaizhan;
/*JDBC批量添加数据*/
//使用循环批量插入数据效率低
/*批量添加数据简介
* 在JDBC中通过PreparedStatement 的对象的addBatch()和executeBatch()
* 方法进行数据的批量插入。
* addBatch() 把若干SQL语句装载到一起，然后后一次性传送到数据库执行，即
* 是批量处理sql数据。
* executeBatch() 会将装载到一起的sql语句执行*/
/*注意：MySql默认情况下是不开启批处理的。
数据库驱动从5.1.13开始添加了一个对rewriteBatchStatement的参数
的处理，该参数能够让MySql开启批处理。在url中添加该参数：
rewriteBatchedStatements=true*/

//Mysql的URL参数说明
/*useUnicode      true/false      是否使用编码集,需配合
                                   characterEncoding 参数使用。
 characterEncoding   utf-8/gbk/...   编码类型
 useSSL         true/false          是否使用SSL协议
 rewriteBatchedStatements    true/false    可以重写向数据库
                                            提交的SQL语句。*/

//useSSL=false&useUnicode=true&characterEncoding=utf-8  这两个连用
/*url = jdbc:mysql://localhost:3306/bjsxt?useSSL=false&useUnicode=true&characterEncoding=utf-8
* 第一个参数用?与前面的分开  之后的的参数用&(和)连接*/

import java.sql.Connection;
import java.sql.PreparedStatement;

/**向MySQL数据库批量添加数据测试类*/
public class AddBatchTest {
    /*适合添加小量数据*/
    public void addBatch01(){
        Connection connection = null;
        PreparedStatement ps = null;

        try{
            /*获取connection对象 连接sql*/
            connection = JdbcUtils.getConnection();
            //获取preparedStatement 对象  预编译sql语句
            ps = connection.prepareCall("insert into users values(default,?,?)");
            //绑定参数
            for(int i=0 ;i<1000;i++){
                ps.setString(1,"ITBZ"+i);
                ps.setInt(2,22);

                //缓存sql
                ps.addBatch();
            }
            //执行sql  将参数打包放入已编译好的sql语句
            ps.executeBatch();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            JdbcUtils.closeResource(ps,connection);
        }
    }

    //适合大量数据添加(万条数据以上)
    public void addBatch02(){
         Connection connection = null;
        PreparedStatement ps = null;
        try{
            connection = JdbcUtils.getConnection();
            ps = connection.prepareStatement("insert into users values(default,?,?)");
            //参数绑定
            for(int i=1;i<=1000;i++){
                ps.setString(1,"it"+i);
                ps.setInt(2,26);

                //缓存sql
                ps.addBatch();
                //如果缓存了500条数据，执行sql
                if(i%500 == 0){
                    ps.executeBatch();

                    //将已执行的数据在缓存中清除，
                    ps.clearBatch();
                }


            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            JdbcUtils.closeResource(ps,connection);
        }
    }


    public static void main(String[] args) {
        AddBatchTest ab = new AddBatchTest();
       // ab.addBatch01();
        ab.addBatch02();
    }

}
